package qqclient.service;

import qqcommon.Message;
import qqcommon.MessageType;
import qqcommon.User;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

/*
 * @author 王艺锡
 * @version 1.0
 * 该类用于将输入的用户名和密码发送的服务端，判断是否正确
 */
public class UserClientService {
    //这里把User和Socket对象做成属性，是为了后边在别的地方可以拿到此属性
    User user = new User();
    Socket socket;

    //编写方法,根据用户名和密码到服务端检查是否合法
    public boolean checkUser(String userid,String pwd){
        boolean flag = false;
        user.setUserId(userid);
        user.setPasswd(pwd);

        try {
            //连接服务端
            socket = new Socket(InetAddress.getLocalHost(), 9999);
            //调用方法，将User对象传输到服务端
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(user);

            //调用方法，接收服务端回复的消息
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            Message message = (Message) ois.readObject();//因为服务端回复的对象一定是Message类型的

            if(message.getMesType().equals(MessageType.MESSAGE_LOGIN_SUCCEED)){
                flag = true;
                //表示User对象正确，登陆成功，创建线程，可以保持和服务端的连接
                ClientConnectServerThread ccst = new ClientConnectServerThread(socket);
                ccst.start();

                //为了方便后期管理线程，这里要把线程加入一个集合内
                ManageClientConnectServerThread.addClientConnectServerThread(userid,ccst);

            }else {
                //如果登录失败，关闭对应的socket
                socket.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return flag;
    }


    //编写方法，向客户端发送请求信息，获取在线用户
    public void getOnlineFriendList(){
        //如果调用此方法，则像服务端发送一个Message对象，类型为MESSAGE_GET_ONLINE_FRIEND，表示想要获取在线用户
        Message message = new Message();
        message.setMesType(MessageType.MESSAGE_GET_ONLINE_FRIEND);
        message.setSender(user.getUserId());

        //获取当前user对象的socket
        try {
            OutputStream outputStream =
                    ManageClientConnectServerThread.getClientConnectServerThread(user.getUserId())
                            .getSocket()
                            .getOutputStream();
            //创建一个对象输出流，像客户端发送请求信息
            ObjectOutputStream oos = new ObjectOutputStream(outputStream);
            oos.writeObject(message);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    //编写方法，向客户端发送退出信息
    public void exitClient(){
        Message message = new Message();
        message.setMesType(MessageType.MESSAGE_CLIENT_EXIT);
        message.setSender(user.getUserId());

        try {
            ObjectOutputStream oos = new ObjectOutputStream(ManageClientConnectServerThread
                    .getClientConnectServerThread(user
                            .getUserId())
                            .getSocket()
                            .getOutputStream());
            oos.writeObject(message);
            System.out.println(user.getUserId() + "退出系统...");
            System.exit(0);//表示正常退出系统
        } catch (IOException e) {
            e.printStackTrace();
        }


    }


}
